#include "../common/common.h"
#include "renderer.h"
#include "rd_surface.h"

#include <stdio.h>
#include <string.h>

static rect_t clip;
static int clip_rows, clip_cols;

void rd_load_map(const char * mapname)
{
	strcpy(rd.map.name, mapname);

	FILE * file;

	char filename[2*MAX_OSPATH+15];
	sprintf(filename, "../maps/%s/tiles", mapname);

	if ((file = fopen(filename, "r")) == NULL) {
		com_fatal(filename);
	}

	char spritefile[MAX_OSPATH];
	fscanf(file, "%s", spritefile);
	sprintf(filename, "../maps/%s/%s", mapname, spritefile);
	rd.map.sprite = rd_load_surface(filename);

	fscanf(file, "%d %d", &rd.map.tm, &rd.map.ts);
	fscanf(file, "%d %d", &rd.map.tw, &rd.map.th);
	fscanf(file, "%d %d", &rd.map.tcols, &rd.map.trows);
	rd.map.w = rd.map.tw * rd.map.tcols;
	rd.map.h = rd.map.th * rd.map.trows;

	clip.w = rd.map.tw;
	clip.h = rd.map.th;
	clip_rows = (rd.map.ts + rd.map.sprite->h - 2*rd.map.tm)
				/(rd.map.tw + rd.map.ts);
	clip_cols = (rd.map.ts + rd.map.sprite->w - 2*rd.map.tm)
				/(rd.map.tw + rd.map.ts);

	rd.map.tile = (int *)com_malloc(rd.map.tcols * rd.map.trows * sizeof(int));

	int i;
	for (i = 0; i < rd.map.tcols * rd.map.trows; i++) {
		fscanf(file, "%d", &rd.map.tile[i]);
	}

	fclose(file);
}

static rect_t * rd_map_clip(int i, int j)
{
	int tile = rd.map.tile[rd.map.tcols*i+j];
	if (tile >= 1 && tile <= clip_cols*clip_rows) {
		clip.x = ((tile - 1) % clip_cols) * (rd.map.tw + rd.map.ts) + rd.map.tm;
		clip.y = ((tile - 1) / clip_cols) * (rd.map.th + rd.map.ts) + rd.map.tm;
		return &clip;
	} else {
		return NULL;
	}
}

void rd_show_map(void)
{
	struct { //camera area
		int left,right,top,bottom;
	} cam_area = {
		rd.camera.x/rd.map.tw,
		(rd.camera.x+rd.camera.w)/rd.map.tw+1,
		rd.camera.y/rd.map.th,
		(rd.camera.y+rd.camera.h)/rd.map.tw+1
	};

	rect_t tile = {.w = rd.map.tw, .h = rd.map.th};

	int i, j;
	for (i = cam_area.top; i < cam_area.bottom; i++) {
	for (j = cam_area.left; j < cam_area.right; j++) {
		tile.x = j * rd.map.tw;
		tile.y = i * rd.map.th;
		rd_apply_surface(tile.x - rd.camera.x, tile.y - rd.camera.y,
				rd.map.sprite, rd.screen, rd_map_clip(i, j));
	}}

}
